/**
 * @description: 钉钉授权登录及用户信息获取 service
 * @version: 0.0.1
 * @author: z..
 * @Date: 2023-06-12 18:16:39
 */

import { Provide, Inject, httpError } from '@midwayjs/core';
import { ApiDingtalk } from '../utils/api.dingtalk';
import { DingTalkUtils } from "../utils/dingTalk";
import { Context } from '@midwayjs/koa';

import { DingtalkAuthService } from "./dingtalk.auth.service"

@Provide()
export class SendDingtalkMsgService {

  @Inject()
  ctx: Context;

  @Inject()
  ApiDingtalk: ApiDingtalk;

  @Inject()
  DingtalkAuthService: DingtalkAuthService;

  @Inject()
  DingTalkUtils: DingTalkUtils;

  /**
     * 发送钉钉消息
     * @param {*} params.id    id
     * @param {*} params.alarm_config    机器人配置数据
     * @param {*} params.alarm_name    报警名称
     * @param {*} params.alarm_content    报警内容 可为空
     * @param {*} params.alarm_type    消息类型
     * @param {*} params.user_ids    需要通知的用户id
     * @param {*} params.msg    前端操作传入的状态
     * @param {*} params.days_num    倒计时距离天数
     * @param {*} params.end_time    截止日期
     * @param {*} params.isApi    是否是api校验
     * @param {*} params.apiRes    api测试结果
     * @returns 
     */
  async dingtalkMsg(params: any): Promise<any> {
    if (params.alarm_type == "GroupRobot") {
      // 群聊机器人通知
      return await this.sendMsgWebhook(params);
    } else if (params.alarm_type == "PersonalRobot") {
      // 单聊机器人通知
      return await this.sendMsgToUsers(params);
    } else if (params.alarm_type == "EmailRobot") {
      // 邮件通知
      return await this.sendMsgEmail(params)
    } else {
      throw new httpError.BadRequestError('未知通知类型');
    }
  }

  /**
   * 单聊通知发送
   * 批量发送人与机器人会话中机器人消息
   * @param {*} params.id    id
   * @param {*} params.alarm_config    机器人配置数据
   * @param {*} params.alarm_name    报警名称
   * @param {*} params.alarm_content    报警内容 可为空
   * @param {*} params.alarm_type    消息类型
   * @param {*} params.alarm_style    消息类型
   * @param {*} params.user_ids    需要通知的用户id
   * @param {*} params.msg    前端操作传入的状态
   * @param {*} params.days_num    倒计时距离天数
   * @param {*} params.end_time    截止日期
   * @returns 
   */
  async sendMsgToUsers(data: any): Promise<any> {
    try {
      const { alarm_name, alarm_content, alarm_style, user_ids, msg, days_num, isApi, apiRes, end_time } = data;
      let _title = msg ? `${alarm_name}-${msg}` : alarm_name;
      //  倒计时数字展示
      let _dayStr = `${alarm_style || ""}距离截至日期（${end_time}）还剩${days_num}天`;
      //  通知内容
      let _content = `任务名称：${_title}\n任务内容：${alarm_content}\n${_dayStr}`;
      if (isApi) {
        if (apiRes && apiRes.isSuccess) {
          _content = `任务名称：${_title}\n任务内容：${alarm_content}\n任务结果：请求成功\n${_dayStr}`;
        } else {
          _content = `任务名称：${_title}\n任务内容：${alarm_content}\n任务结果：请求失败\n返回结果：${apiRes.logRes}\n${_dayStr}`;
        }
      }

      const appToken = await this.DingtalkAuthService.getAppToken();
      if (!appToken || !appToken.success) throw new httpError.BadRequestError('获取应用token失败');

      //  发送企业内单聊通知
      return await this.ApiDingtalk.oToMessagesBatchSend({
        token: appToken.accessToken,
        robotCode: "dingsdfd0sfotgj0og95",
        userIds: user_ids,
        msgKey: "sampleText",
        msgParam: {
          content: _content,
        }
      });
    } catch (error) {
      return error;
    }
  }

  /**
   * 群聊通知发送
   * 企业内部机器人使用Webhook发送群聊消息
   * @param {*} params.id    id
   * @param {*} params.alarm_config    机器人配置数据
   * @param {*} params.alarm_name    报警名称
   * @param {*} params.alarm_content    报警内容 可为空
   * @param {*} params.alarm_type    消息类型
   * @param {*} params.alarm_style    消息类型
   * @param {*} params.user_ids    需要通知的用户id
   * @param {*} params.msg    前端操作传入的状态
   * @param {*} params.days_num    倒计时距离天数
   * @param {*} params.end_time    截止日期
   * @returns
   */
  async sendMsgWebhook(data: any): Promise<any> {
    try {
      const { alarm_config, alarm_name, alarm_content, alarm_style, user_ids, msg, days_num, isApi, apiRes, end_time } = data;

      if (!alarm_config) throw new httpError.BadRequestError("通知任务配置信息错误");
      const { webhook, sign, keywords } = JSON.parse(alarm_config);

      let _title = msg ? `${alarm_name}-${msg}` : alarm_name;
      //  关键词展示
      let _contentstr = keywords ? `${keywords}-${alarm_content}` : alarm_content;
      //  倒计时数字展示
      let _dayStr = `${alarm_style || ""}距离截至日期（${end_time}）还剩${days_num}天`;

      let _content = `任务名称：${_title}\n任务内容：${_contentstr}\n${_dayStr}`;
      let _atuser_ids = user_ids;
      let _isAtAll = false;
      //  网站&api告警测试
      if (isApi) {
        //  当负责人为空且接口访问报错，这个时候@所有人
        _isAtAll = (!user_ids.length && !apiRes.isSuccess) ? true : false;
        _atuser_ids = apiRes.isSuccess ? [] : user_ids;

        if (apiRes && apiRes.isSuccess) {
          _content = `任务名称：${_title}\n任务内容：${_contentstr}\n任务结果：请求成功\n${_dayStr}`;
        } else {
          _content = `任务名称：${_title}\n任务内容：${_contentstr}\n任务结果：请求失败\n返回结果：${apiRes.logRes}\n${_dayStr}`;
        }
      };
      let textForm = {
        msgtype: 'text',
        text: {
          content: _content,
        },
        at: {
          atUserIds: _atuser_ids,
          isAtAll: _isAtAll,
        }
      };
      return await this.DingTalkUtils.dingdingRobot(webhook, textForm, sign);
    } catch (error) {
      throw new httpError.BadRequestError("群聊通知发送失败"+JSON.stringify(error));
    }
  }

  /**
   * 邮件通知提醒
   * @param {*} params.id    id
   * @param {*} params.alarm_config    机器人配置数据
   * @param {*} params.alarm_name    报警名称
   * @param {*} params.alarm_content    报警内容 可为空
   * @param {*} params.alarm_type    消息类型
   * @param {*} params.user_ids    需要通知的用户id
   * @param {*} params.msg    前端操作传入的状态
   * @param {*} params.days_num    倒计时距离天数
   * @param {*} params.end_time    截止日期
   * @returns 
   */
  async sendMsgEmail(data: any): Promise<any> {
    // const { alarm_config, alarm_name, alarm_content, id, alarm_type, user_ids, msg, days_num } = data;
    console.log(" sendMsgEmail", data)
    throw new httpError.BadRequestError('邮件功能正在完善中...');
  }

}